//package com.sunxd.rule.judge;
//
//import com.google.common.collect.Lists;
//import com.google.common.collect.Sets;
//import com.sunxd.rule.judge.beans.enums.OperatorType;
//import com.sunxd.rule.judge.beans.param.Condition;
//import org.springframework.boot.SpringApplication;
//import org.springframework.boot.autoconfigure.SpringBootApplication;
//
//import java.math.BigDecimal;
//import java.util.Date;
//
//
/**
 使用步骤
 1. pom.xml 中，引入jar包
 <dependency>
 <groupId>com.sunxd</groupId>
 <artifactId>z-common-rule-judge</artifactId>
 <version>1.0.0-SNAPSHOT</version>  //需要当前最新的版本号
 </dependency>

 使用  ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GT.name()).left(2).right(1).build())

 2. 自定义校验类  eg: com.sunxd.rule.judge.spi.MyselfJudge
     1.1.  继承 AbstractCustomerJudge 并加上 @Component 注解
     1.2。  指定invokeKey, 实现判断方法。

 使用： ConditionUtil.doJudge(Condition.builder().operatorType(OperatorTypeEnum.INVOKE.name()).invokeKey("judgeNameLength").left("ABC").right(5).build())
        operatorType： 固定为  “INVOKE”
        invokeKey：    为 指定的invokeKey 的值
*/
//@SpringBootApplication
//public class RuleJudgeApplication {
//
//    public static void main(String[] args) {
//        SpringApplication.run(RuleJudgeApplication.class, args);

//        Date nowDate = new Date();
//        long nowDateTime = nowDate.getTime();
//
//
//        // GT 默认解析  int double  long  date 类型的数据
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GT.name()).left(2).right(1).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GT.name()).left(2.0).right(1.0).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GT.name()).left(2L).right(1L).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GT.name()).left(new Date(nowDateTime)).right(new Date(nowDateTime - 1000L)).build()));
//
//        // EQ  默认使用Objects.equals() 方法
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.EQ.name()).left(1).right(1).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.EQ.name()).left(2.0).right(2.0).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.EQ.name()).left(2L).right(2L).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.EQ.name()).left("2").right("2").build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.EQ.name()).left(new BigDecimal("2")).right(new BigDecimal("2")).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.EQ.name()).left(new Date(nowDateTime)).right(new Date(nowDateTime)).build()));
//
//
//        // IN 默认使用  Collections遍历，然后使用Objects.equals（） 方法判断
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.IN.name()).left(1).right(Lists.newArrayList(1,2)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.IN.name()).left(2.0).right(Lists.newArrayList(1.0,2.0)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.IN.name()).left(2L).right(Lists.newArrayList(2L)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.IN.name()).left("2").right(Lists.newArrayList("2")).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.IN.name()).left(new BigDecimal("2")).right(Lists.newArrayList(new BigDecimal("2"))).build()));
//
//
//        // GTE_LTE  结合 GTE 和 LTE 功能使用
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GTE_LTE.name()).left(1).right(Lists.newArrayList(1,2)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GTE_LTE.name()).left(1).right(Sets.newHashSet(1, 2)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GTE_LTE.name()).left(1).right(Sets.newHashSet(2, 1)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GTE_LTE.name()).left(2.0).right(Lists.newArrayList(1.0,2.0)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GTE_LTE.name()).left(2L).right(Lists.newArrayList(1L,2L)).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorType.GTE_LTE.name()).left(new Date(nowDateTime)).right(Lists.newArrayList(new Date(nowDateTime),new Date(nowDateTime+1000L))).build()));
//
// --- SPI 扩展自定义实现

//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorTypeEnum.INVOKE.name()).invokeKey("judgeNameLength").left("ABC").right(5).build()));
//        System.out.println(ConditionUtil.doJudge(Condition.builder().operatorType(OperatorTypeEnum.INVOKE.name()).invokeKey("judgeNameLength").left("ABCDEDFG").right(5).build()));

//        // ------------------------  拓展使用  ------------------------
//        // GTE 使用   GT || EQ
//        // LT 使用  !GT
//        // LTE 使用  !GT || EQ
//    }
//
//}
